"""
查看对话信息在Redis中的存储位置
"""

from redis import Redis
from config.settings import settings
import json

def check_redis_storage():
    """检查Redis存储位置"""
    print("=" * 60)
    print("对话信息在Redis中的存储位置")
    print("=" * 60)
    
    # 连接Redis
    r = Redis(
        host=settings.REDIS_HOST,
        port=settings.REDIS_PORT,
        db=1,  # 使用db=1存储对话数据
        decode_responses=False
    )
    
    print(f"\nRedis连接信息:")
    print(f"  - 主机: {settings.REDIS_HOST}")
    print(f"  - 端口: {settings.REDIS_PORT}")
    print(f"  - 数据库: db=1 (对话数据存储在这里)")
    
    # 查找所有对话相关的key
    keys = r.keys("chat:*")
    
    print(f"\n存储位置详情:")
    print(f"  - Key前缀: chat:")
    print(f"  - 找到 {len(keys)} 个相关key")
    
    if keys:
        print("\n具体存储结构:")
        
        # 分类统计
        metadata_keys = []
        message_keys = []
        list_keys = []
        
        for key in keys:
            key_str = key.decode('utf-8') if isinstance(key, bytes) else key
            if ':metadata:' in key_str:
                metadata_keys.append(key_str)
            elif ':messages:' in key_str:
                message_keys.append(key_str)
            elif key_str == 'chat:list':
                list_keys.append(key_str)
        
        # 显示对话列表
        if list_keys:
            print(f"\n1. 对话列表 (Sorted Set):")
            list_key = 'chat:list'
            conv_ids = r.zrevrange(list_key, 0, -1)
            print(f"   Key: {list_key}")
            print(f"   类型: Sorted Set (有序集合)")
            print(f"   数量: {len(conv_ids)} 个对话")
            if conv_ids:
                print(f"   对话ID列表:")
                for i, conv_id_bytes in enumerate(conv_ids[:10], 1):  # 只显示前10个
                    conv_id = conv_id_bytes.decode('utf-8') if isinstance(conv_id_bytes, bytes) else conv_id_bytes
                    score = r.zscore(list_key, conv_id)
                    print(f"     [{i}] {conv_id} (更新时间戳: {score})")
        
        # 显示对话元数据
        if metadata_keys:
            print(f"\n2. 对话元数据 (Hash):")
            print(f"   Key格式: chat:metadata:{{conversation_id}}")
            print(f"   类型: Hash (哈希表)")
            print(f"   数量: {len(metadata_keys)} 个对话的元数据")
            if metadata_keys:
                print(f"   示例:")
                for key_str in metadata_keys[:3]:  # 只显示前3个
                    conv_id = key_str.split(':')[-1]
                    metadata = r.hgetall(key_str)
                    print(f"     Key: {key_str}")
                    print(f"     对话ID: {conv_id}")
                    print(f"     字段数: {len(metadata)}")
                    for field, value in list(metadata.items())[:3]:  # 只显示前3个字段
                        field_str = field.decode('utf-8') if isinstance(field, bytes) else field
                        value_str = value.decode('utf-8') if isinstance(value, bytes) else value
                        print(f"       - {field_str}: {value_str[:50]}")
        
        # 显示对话消息
        if message_keys:
            print(f"\n3. 对话消息 (List):")
            print(f"   Key格式: chat:messages:{{conversation_id}}")
            print(f"   类型: List (列表)")
            print(f"   数量: {len(message_keys)} 个对话的消息")
            if message_keys:
                print(f"   示例:")
                for key_str in message_keys[:3]:  # 只显示前3个
                    conv_id = key_str.split(':')[-1]
                    messages = r.lrange(key_str, 0, -1)
                    print(f"     Key: {key_str}")
                    print(f"     对话ID: {conv_id}")
                    print(f"     消息数: {len(messages)}")
                    if messages:
                        # 显示第一条和最后一条消息
                        first_msg = json.loads(messages[0].decode('utf-8'))
                        last_msg = json.loads(messages[-1].decode('utf-8'))
                        print(f"       第一条: [{first_msg.get('role')}] {first_msg.get('content', '')[:30]}...")
                        print(f"       最后一条: [{last_msg.get('role')}] {last_msg.get('content', '')[:30]}...")
    else:
        print("\n当前Redis中没有对话数据")
        print("\n存储结构说明:")
        print("  当创建对话时，会在Redis中创建以下结构:")
        print("  1. chat:metadata:{conversation_id}  (Hash)")
        print("     - title: 对话标题")
        print("     - created_at: 创建时间")
        print("     - updated_at: 更新时间")
        print("     - message_count: 消息数量")
        print("")
        print("  2. chat:messages:{conversation_id}  (List)")
        print("     - 存储JSON格式的消息列表")
        print("     - 每条消息包含: role, content, timestamp等")
        print("")
        print("  3. chat:list  (Sorted Set)")
        print("     - 存储所有对话ID")
        print("     - Score为更新时间戳")
        print("     - 用于快速获取最新对话（只返回5条）")
    
    print("\n" + "=" * 60)
    print("存储位置总结:")
    print("=" * 60)
    print("Redis数据库: db=1")
    print("Key命名规则:")
    print("  - 对话元数据: chat:metadata:{conversation_id}")
    print("  - 对话消息:   chat:messages:{conversation_id}")
    print("  - 对话列表:   chat:list")
    print("=" * 60)

if __name__ == "__main__":
    check_redis_storage()

